<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>New 具体做了什么</title>
</head>

<body>
    <h1>New 具体做了什么？</h1>

    <h4>步骤：</h4>
    <ol>
        <li>先创建一个空对象</li>
        <li>把空对象和构造函数通过原型链进行连接</li>
        <li>把构造函数的 this 绑定到新的空对象</li>
        <li>根据构建函数返回的类型判断，如果是值类型，则返回对象。如果是引用类型，就要返回这个引用类型</li>
    </ol>

    <script>
        function newFun(Fun, ...args) {
            // 先创建一个空对象
            let newObj = {}

            // 把空对象和构造函数通过原型链进行链接
            newObj.__proto__ = Fun.prototype

            // 把构造函数的 this 绑定到新的空对象
            const result = Fun.apply(newObj, args)

            // 返回值
            return result instanceof Object ? result : newObj
        }

        function Person(name) {
            this.name = name
        }
        Person.prototype.say = function() {
            console.log(this.name);
        }
        const p1 = newFun(Person, 'lee')
        p1.say()
        console.log(p1);
    </script>
</body>

</html>